package com.powernobug.servlet;

import com.powernobug.bean.vo.BaseRespVo;
import com.powernobug.bean.vo.PageVo;
import com.powernobug.bean.vo.data.DetailData;
import com.powernobug.bean.vo.param.OrderListParam;
import com.powernobug.service.AdminOrderService;
import com.powernobug.service.impl.AdminOrderServiceImpl;
import com.powernobug.util.Constant;
import com.powernobug.util.JsonUtil;
import com.powernobug.util.QueryParamPackageUtil;
import org.apache.ibatis.exceptions.PersistenceException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;

/**
 * @Author: 肖云戈
 * @CreateTime: 2024-08-21
 * @Description:
 */
@WebServlet("/order/*")
public class AdminOrderServlet extends CommonServlet {
    private static AdminOrderService adminOrderService = new AdminOrderServiceImpl();

    public BaseRespVo list(HttpServletRequest req) {
        // 从请求行中解析出请求参数 -> page、limit、sort、order、start、end，并封装为QueryParam对象
        OrderListParam orderListParam = QueryParamPackageUtil.packParams(OrderListParam.class, req);
        // 传入QueryParam对象，进入model层调用并查找数据，封装为pageVo对象
        PageVo pageVo = adminOrderService.getOrdersByPage(orderListParam);
        // 将pageVo对象传入BaseRespVo，结束调用
        return BaseRespVo.okList(pageVo);
    }

    public BaseRespVo detail(HttpServletRequest req) {
        // 从请求行中解析出id，用于查询参数
        String id = req.getParameter("id");
        if (id == null)
            throw new PersistenceException();
        // 调用 model 层进行连接查询，将从三张表中查询到的连接数据，封装为一个 DetailData 对象
        DetailData detailData = adminOrderService.getOrderDetailsById(id);
        // 将 DetailData 对象封装为 BaseRespVo 返回
        return BaseRespVo.okList(detailData);
    }

    public BaseRespVo refund(HttpServletRequest req) throws IOException {
        // 从请求行中读出 orderId 和 refundMoney 为 Map
        Map<String, Integer> map = JsonUtil.readRequestLineToMap(req);
        // 调用 model 层，进行 修改订单状态、商品货品增加、返还优惠券 三种操作，记得增加事务，并返回布尔值
        // orderId必须和refundMoney一一对应，做一个校验
        boolean isSuccess = adminOrderService.refund(map);
        // 根据布尔值返回提示是否成功（BaseRespVo.okList/BaseRespVo.errList）
        return isSuccess ? BaseRespVo.okList(null) : BaseRespVo.errList(402);
    }

    public BaseRespVo channel(HttpServletRequest req) {
        // 获取请求后，直接读取配置文件 express-vendors.properties
        List<Map<String, String>> channelList = new ArrayList<>();
        Properties channelConf = (Properties) getServletContext().getAttribute(Constant.CHANNELS_CONF);
        Enumeration<Object> channelElements = channelConf.keys();
        while (channelElements.hasMoreElements()) {
            String name = (String) channelElements.nextElement();
            String value = channelConf.getProperty(name);
            channelList.add(Map.of("name",name, "value",value));
        }
        // 获取到数据后，直接封装为 List<Map<String, String>> 返回BaseRespVo即可
        return BaseRespVo.okList(channelList);
    }

    public BaseRespVo ship(HttpServletRequest req) throws IOException {
        // 从请求行中读出 orderId 和 shipChannel 和 shipSn 封装为Map<String, Object>
        Map<String, Object> map = JsonUtil.readRequestLineToMap(req);
        // 调用 model 层，进行 修改订单状态、修改订单发货编号、修改订单发货公司 三种操作，记得增加事务，并返回布尔值
        boolean isSuccess = adminOrderService.ship(map);
        // 根据返回布尔值返回提示是否成功（BaseRespVo.okList/BaseRespVo.errList）
        return isSuccess ? BaseRespVo.okList(null) : BaseRespVo.errList(602);
    }

    public BaseRespVo delete(HttpServletRequest req) throws IOException {
        // 从请求行中读出 orderId 封装为Map<String, Integer>
        Map<String, Integer> map = JsonUtil.readRequestLineToMap(req);
        // 调用 model 层，进行 修改订单逻辑删除、修改订单中商品的逻辑删除 两个操作，记得增加事务，并返回布尔值
        boolean isSuccess = adminOrderService.delete(map);
        // 根据返回布尔值返回提示是否删除成功（BaseRespVo.okList/BaseRespVo.errList）
        return isSuccess ? BaseRespVo.okList(null) : BaseRespVo.errList(623);
    }
}
